K8s 是容器编排工具,理解它的网络,本质是理解容器间的网络互访原理。容器通过 namespace 做网络隔离,每个容器拥有独立的网卡、回环设备与端口。本章从通信原理出发:先讲同宿主机与跨宿主机的两种通信机制(隧道封装 vs 路由),再剖析 K8s 的 CNI 插件体系,最后对比 Flannel(UDP/VXLAN)与 Calico(BGP/IPIP)两大主流方案。
同一宿主机的两个容器(如 Docker01/Docker02)各有自己的网卡 eth0,宿主侧对应一对虚拟网卡 Veth。所有 Veth 接入宿主机上的网桥(bridge)——相当于二层虚拟交换机,让同宿主机容器互联互通。
跨宿主机的容器通信有两种方案:
| 方案 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 隧道封装 | 在容器内层包上封装一层虚拟包头(VXLAN/GRE) | 不依赖二层网络,通用 | 封装/解封有性能损耗 |
| 路由 | 修改路由表控制下一跳 IP | 性能好 | 需解决动态路由问题,实现复杂 |
隧道方案:容器 A 的包从 C 端封包(加上外层 C→D 的 IP/MAC 包头),经宿主机网络传到 D 后解包,容器 B 看到的是原始 IP/MAC——数据包借助宿主机网络"搭车"完成跨机通信。
路由方案:在宿主机 C 上添加路由——目标为 B 的 IP 网段时,下一跳指向宿主机 D(如 192.168.0.2),A 的包直接经路由转发到 D 再交给容器 B。
K8s 通过 CNI(Container Network Interface) 插件规范容器网络,提供三类核心能力:
常见 CNI 插件:Flannel、Canal、Calico 等,它们各自实现"同节点桥接 + 跨节点连通"的完整方案。
每台宿主机运行 Flanneld 进程,通过查询 etcd 获取"子网 ↔ 宿主机"对应关系;数据平面有 flannel1 网卡。发送流程:容器 A 的包经 veth 到网桥 → Flanneld(用户态)封装目标物理机 IP 与监听端口 → 经 flannel1/eth0 发出。
致命短板:UDP 封装在用户态完成,涉及用户态↔内核态数据拷贝,性能损耗大。
同样是报文封装,但封装/解封完全交给 Linux 内核实现,不再经过用户态,性能显著提升——这是 Flannel 生产环境的推荐模式。
Flannel 系基于报文封装,要追求最高性能需走路由模式——Calico 正是这套机制的实现。
动态路由是路由模式的核心难题,Calico 用两个组件解决:
| 组件 | 职责 |
|---|---|
| BGP Speaker | 路由广播,交换各节点容器网段信息 |
| Felix | 路由配置,维护主机路由与策略 |
由于不封装/解封数据包,性能最优;但路由模式受制于二层网络条件(BGP 需要节点二层可达)。
结合路由协议与底层封装:通过 tun0 网卡把不同主机用隧道打通,既保留路由性能,又突破二层网络限制——适合跨网段/跨机房的大规模集群。
| 插件/模式 | 机制 | 性能 | 适用 |
|---|---|---|---|
| Flannel UDP | 用户态封装 | 低 | 学习演示 |
| Flannel VXLAN | 内核态封装 | 中 | 中小集群默认 |
| Calico BGP | 纯路由 | 高 | 二层可达的同网段集群 |
| Calico IPIP | 路由+封装 | 高 | 跨网段大规模集群 |
下一章讲解基于 K8s 架构打造 CICD 平台的核心思路——镜像、编排与发布流水线的完整闭环。